#include <stdlib.h>
#include <stdio.h>
#include <iostream>
//有链栈结构及相关定义如下：
typedef char DataType;
struct node{
    DataType data;  //数据元素
    struct node *next; //指向下一个数据元素的指针
};
typedef struct node *PtrToNode;
typedef PtrToNode Stack;

//入栈函数，参数：入栈数据元素，栈头指针
void push(DataType x , Stack s)
{
    //请在此处填写代码，实现入栈操作
    /*- - - - -begin - - - - - */
    Stack L=(Stack)malloc(sizeof(struct  node));
        L->data=x;
        s->next=L;
        L->next=NULL;

    /* - - - - - end- - - - -*/
}

//判定栈是否为空，若栈为空，则返回1，否则返回0
int isEmpty(Stack s)
{
    //请在此处填写代码，实现判定栈是否为空操作，若栈为空，则返回1，否则返回0
    //begin
    return s->next==NULL;

    //end
}

//出栈，并返回栈顶元素
DataType pop(Stack s)
{
    if(isEmpty(s) == 0)
    {
        DataType x = s->next->data;
        PtrToNode p = s->next ;
        s->next = p->next ;
        delete p ;
        return x ;
    }
    else
        return 0;
}

void balance( char str[])
{
    //请在此处填写代码，实现平衡符号的判定

    //begin
    Stack s=(Stack)malloc(sizeof(struct node));
    for (int i = 0; str[i]!='\0'; ++i)
    {
        switch (str[i])
        {
            case'[': push(str[i],  s);break;
            case'{':push(str[i],s);break;
            case'(':push(str[i],s);break;
            case']':
            case'}':
            case')':
                if (str[i]==pop(s))
                    break;
                else
                {
                    printf("NO");
                    return ;
                }

        }

    }
    printf("yes");

    //end
}

int main()
{
    char str[90] ;
    std::cin>>str ;
    balance(str);

}
